<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

include_once('ExceptionDAO.php');
include_once('TOEditora.php');
include_once 'util/MapError.php';

/**
 * DAO para operações de banco de dados para Editora
 * 
 * @author Douglas Rafael
 */
class DAOEditora extends CI_Model {

    /**
     * Lista todas as editoras cadastradas
     * 
     * @param int    $init      Posição inicial do cursor
     * @param int    $quant     Total de registros
     * @param string $orderby   Nome da coluna a ser ordenada
     * @param string $direction Direção: ASC ou DESC
     * @return array TOEditora  Array de objeto
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function select_all_publishers($init, $quant, $orderby = NULL, $direction = NULL) {
        try {
            $orderby != NULL && $direction != NULL ? $this->db->order_by($orderby, $direction) : $this->db->order_by('id', 'ASC');
            $result = $this->db->get('editora', $quant, $init);

            //Caso ocorra erro no select
            if (!$result) {
                throw new Exception('Ocorreu um erro de banco de dados ao tentar listar as editoras.');
            } else {
                $editoras = array();
                foreach ($result->result() as $value) {
                    $editora = new TOEditora();
                    $editora->id = $value->id;
                    $editora->nome = $value->nome;
                    $editora->telefone = $value->telefone;
                    $editora->email = $value->email;
                    $editora->site = $value->site;
                    array_push($editoras, $editora);
                }
                return $editoras;
            }
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }

    /**
     * Retorna o Total geral de editoras cadastradaas.
     * 
     * @return int Total de resgistros
     */
    public function amount_all_publishers() {
        return $this->db->count_all_results('editora');
    }

    /**
     * Seleciona editora de acordo com o id passado como parametro.
     * 
     * @param TOEditora $editora
     * @return TOEditora
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function get_publisher(TOEditora $editora) {
        try {
            $this->db->where("id", $editora->id);
            $result = $this->db->get('editora');

            //Caso ocorra erro no select
            if (!$result) {
                throw new Exception('Ocorreu um erro de banco de dados ao tentar selecionar editora.');
            } else {
                $value = $result->row();

                $editora = new TOEditora();
                $editora->id = $value->id;
                $editora->nome = $value->nome;
                $editora->telefone = $value->telefone;
                $editora->email = $value->email;
                $editora->site = $value->site;

                return $editora;
            }
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }
    
    /**
     * Insere no banco de dados a editora.
     * 
     * @param TOEditora $editora
     * @throws ExceptionDAO 
     */
    public function insert_publisher(TOEditora $editora) {
        try {
            $result = $this->db->insert('editora', $editora);

            if (!$result) {
                throw new Exception();
            }
        } catch (Exception $erro) {
            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($this->db->_error_number(), $this->db->_error_message(), $editora->nome));
        }
    }
    
    /**
     * Atualiza dados da editora
     * 
     * @param TOEditora $editora Dados da editora a ser atualizada
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function update_publisher(TOEditora $editora) {
        try {
            $this->db->where('id', $editora->id);
            $result = $this->db->update('editora', $editora);

            if (!$result) {
                throw new Exception;
            }
        } catch (Exception $erro) {
            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($this->db->_error_number(), $this->db->_error_message(), $editora->nome));
        }
    }
    
    /**
     * Excluir editora de acordo com o id.
     * 
     * @param TOEditora $editora
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function delete_publisher(TOEditora $editora) {
        try {
            $this->db->where_in('id', $editora->id);
            $result = $this->db->delete('editora');

            if (!$result) {
                throw new Exception();
            }
        } catch (Exception $erro) {
            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($this->db->_error_number(), $this->db->_error_message(), $editora->nome));
        }
    }
    
    /**
     * Efetua Busca por editora.
     * 
     * @param type $init
     * @param type $quant
     * @param type $term
     * @param type $orderby
     * @param type $direction
     * @return array
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function search_publisher($init, $quant, $term = NULL, $orderby = NULL, $direction = NULL) {
        try {
            $this->db->like('id', $term);
            $this->db->or_like('nome', $term);
            $orderby != NULL && $direction != NULL ? $this->db->order_by($orderby, $direction) : $this->db->order_by('id', 'ASC');
            $result = $this->db->get('editora', $quant, $init);

            //Caso ocorra erro no select
            if (!$result) {
                throw new Exception('Ocorreu um erro de banco de dados ao tentar buscar editora.');
            } else {
                $editoras = array();
                foreach ($result->result() as $value) {
                    $editora = new TOEditora();
                    $editora->id = $value->id;
                    $editora->nome = $value->nome;
                    $editora->telefone = $value->telefone;
                    $editora->email = $value->email;
                    $editora->site = $value->site;
                    array_push($editoras, $editora);
                }
                return $editoras;
            }
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }

    /**
     * Retorna a quantidade de registros da busca
     * 
     * @param string $term
     * @return int
     */
    public function amount_search_publisher($term) {
        $this->db->like('id', $term);
        $this->db->or_like('nome', $term);

        return $this->db->count_all_results('editora');
    }

    
    /**
     * Retorna sugestões de editoras de acordo com o term digitado
     * Útil para utilizar no autocomplete
     * 
     * @param TOEditora $editora
     * @return type
     */
    public function suggestion_publisher(TOEditora $editora) {
        $this->db->like('nome', $editora->nome);
        $result = $this->db->get('editora');

        $editoras = array();
        if ($result) {
            foreach ($result->result() as $value) {
                $data['label'] = $value->nome;
                $data['id'] = $value->id;
                array_push($editoras, $data);
            }
            return $editoras;
        }
    }
}